/**
 * 
 */
package de.hwr.chronix.client;

import com.bradrydzewski.gwt.calendar.client.Appointment;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

import de.hwr.chronix.client.dto.AttendeeDTO;
import de.hwr.chronix.client.dto.PollDTO;



/**
 * @author Florian Mueller
 *
 */
@RemoteServiceRelativePath("chron")
public interface ChronixService extends RemoteService {
	/**
	 * Erzeugt eine Abstimmung und macht sie persistent. Dabei werden die IDs in dem Object gespeichert und zurueck gegeben.
	 * @param poll Abstimmung die gespeichert werden soll.
	 * @return Abstimmung die die IDs enthaelt
	 * @throws IllegalArgumentException sollte ein Fehler durch fehlerhafte Attribute in dem Object entstehen wird diese Exception geworfen.
	 */
	PollDTO createPoll (PollDTO poll) throws IllegalArgumentException ;
	/**
	 * Liefert die Abstimmung anhand von der Admin ID, die Admin ID sollte nicht zurueck uebergeben werden.
	 * @param adminID adminID der Abstimmung
	 * @return Abstimmung
	 * @throws IllegalArgumentException Falsche / Illegale AdminID
	 */
	PollDTO getPollAdmin(String adminID) throws IllegalArgumentException;
	/**
	 * Update der Abstimmung. Dazu ist das Abstimmungsobject und zur verifizierung die Admin ID erforderlich.
	 * Aendern der Abstimmung nur moeglich solange niemand abgestimmt hat.
	 * @param adminID
	 * @param poll
	 * @return true wenn erfolgreich
	 * @throws IllegalArgumentException
	 */
	boolean updatePoll(String adminID,PollDTO poll) throws IllegalArgumentException;
	/**
	 * Liefert das Abstimmungsobject fuer normale User, Ohne AbstimmungsID
	 * @param pollID
	 * @return
	 * @throws IllegalArgumentException
	 */
	PollDTO getPollUser(String pollID) throws IllegalArgumentException;
	/**
	 * Abstimmen ueber eine Zeit, wann man frei hat
	 * @param poll Abstimmung an der der User teilnimmt
	 * @param Attendee Benutzer der Abstimmt
	 * @param TimeslotAttendee Liste wann der Benutzer Zeit hat
	 * @return boolean wenn erfolgreich
	 * @throws IllegalArgumentException
	 */
	boolean vote(PollDTO poll, AttendeeDTO benutzer)throws IllegalArgumentException;
	
	Appointment getBestSlot(PollDTO poll)throws IllegalArgumentException;
}
